package upc.dew.inscripcionalumnos.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

import upc.dew.inscripcionalumnos.model.Estado;
import upc.dew.inscripcionalumnos.model.Postulante;
import upc.dew.inscripcionalumnos.model.Usuario;

/**
 *
 * @author andres
 */
public class PostulanteController extends BaseController
{
    private static final String PARAMETRO_ACCION = "accion";
    private static final String ACCION_GUARDAR_REQUISITO = "guardarRequisito";
    private static final String ACCION_CANCELAR = "cancelar";
    private static final String ACCION_FINALIZAR_REQUISITO = "finalizarRequisito";
    private static final String ACCION_ACEPTAR = "aceptar";

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception
    {
        Map<String, Object> model = new HashMap<String,Object>();

        if(esAccionGuardarRequisito(request))
        {
           return new ModelAndView("postulante_Fase_2");
        }
        else if(esAccionCancelar(request))
        {
            return new ModelAndView(new RedirectView("login.do?accion=logout"));
        }
        else if(esAccionFinalizarRequisito(request))
        {
            return new ModelAndView("postulante_Fase_2_Confirmacion");
        }
        else if(esAccionAceptar(request))
        {
            return new ModelAndView(new RedirectView("login.do?accion=logout"));
        }
        else
        {
           Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
           Postulante postulante = (Postulante) getPostulanteService().obtenerPostulantePorCodigoUsuario(usuario.getCodigo());
           request.getSession().setAttribute("postulante", postulante);

           model.put("postulante", postulante );
           model.put("usuario", usuario );

           if(esFaseUnoPendiente(postulante.getFase(), postulante.getEstado()))
           {
               return new ModelAndView(new RedirectView("ficha.do"));
           }
           else if(esFaseUnoEnviado(postulante.getFase(), postulante.getEstado()))
           {
               return new ModelAndView("postulante_Fase_1_Confirmacion", model);
           }
           else if(esFaseDosPendiente(postulante.getFase(), postulante.getEstado()))
           {
              model.put("modalidades", getCatalogoService().obtenerModalidades());
              return new ModelAndView("postulante_Fase_2", model);
           }
           else if(esFaseDosEnviado(postulante.getFase(), postulante.getEstado()))
           {
               return new ModelAndView("postulante_Fase_2_Confirmacion", model);
           }
           else if(esFaseTres(postulante.getFase()))
           {
               return new ModelAndView("postulante_Fase_3_Confirmacion", model);
           }
           else
           {
               return new ModelAndView(new RedirectView("ficha.do"));
           }
        }
    }

    private boolean esFaseUnoPendiente(Integer fase, String estado)
    {
        return ( ( Estado.PENDIENTE.equals(estado) || Estado.PENDIENTE.equals(estado) ) && fase == 1);
    }

    private boolean esFaseUnoEnviado(Integer fase, String estado)
    {
        return (Estado.ENVIADO.equals(estado) && fase == 1);
    }

    private boolean esFaseDosPendiente(Integer fase, String estado)
    {
        return ( (Estado.PENDIENTE.equals(estado) || Estado.OBSERVADO.equals(estado) ) && fase == 2);
    }

    private boolean esFaseDosEnviado(Integer fase, String estado)
    {
        return (Estado.ENVIADO.equals(estado) && fase == 2);
    }

    private boolean esFaseTres(Integer fase)
    {
        return fase == 3;
    }

    private boolean esAccionGuardarRequisito(HttpServletRequest request)
    {
        return ACCION_GUARDAR_REQUISITO.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionCancelar(HttpServletRequest request)
    {
        return ACCION_CANCELAR.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionFinalizarRequisito(HttpServletRequest request)
    {
        return ACCION_FINALIZAR_REQUISITO.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionAceptar(HttpServletRequest request)
    {
        return ACCION_ACEPTAR.equals(request.getParameter(PARAMETRO_ACCION));
    }
}